package main

import (
	"context"
	"fmt"
	"time"
)

func ctx_cancel() {
	// 创建一个 context
	ctx, cancel := context.WithCancel(context.Background())
	go woker1(ctx)
	time.Sleep(5 * time.Second)
	// 手动取消 ctx
	cancel()
}

func ctx_deadline() {
	ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
	go woker1(ctx)
	// 阻塞等待 ctx 会在5s后自动被取消
	<-ctx.Done()
}

func ctx_timeout() {
	ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
	go woker1(ctx)
	// 阻塞等待 ctx 会在5s后自动被取消
	<-ctx.Done()
}

func woker1(ctx context.Context) {
	for {
		time.Sleep(1 * time.Second)
		select {
		case <-ctx.Done():
			fmt.Println("woker1 done exit")
			return
		default:
			fmt.Println("woker1 working")
		}
	}
}

func main() {
	// ctx_cancel()
	// ctx_deadline()
	ctx_timeout()
	time.Sleep(1 * time.Second)
}
